﻿using Ext.Net;
using Ext.Net.MVC;
using Newtonsoft.Json;
using PcaCaja.BOL;
using PcaCore.BOL.Pca;
using PcaCore.DAL;
using PcaCore.DAL.Log;
using PcaCore.DAL.Pca;
using PcaParqueos.BOL;
using PcaParqueos.DAL;
using PcaSocios.BOL;
using PcaSocios.DAL;
using PcaWeb.Areas.Parqueos.Models;
using PcaWeb.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace PcaWeb.Areas.Parqueos.Controllers
{
    public class PagoAbonadoController : ControllerUser
    {
        public ActionResult Index()
        {
            return View();
        }

        public ActionResult GetList(StoreRequestParameters parameters, long? clienteId, string detalle)
        {
            int total;
            List<oVwPagoAbonado> pagos = dPagoAbonado.GetList(parameters.Start,
                                                               parameters.Limit,
                                                               out total,
                                                               dSesion.GetEmpresaId(),
                                                               dSesion.GetOficinaId(),
                                                               Convert.ToInt64(clienteId),
                                                               detalle);
            return this.Store(pagos, total);
        }

        public ActionResult FrmEditarTarifa(long? clienteId)
        {
            try
            {
                oVwCliente cliente = dCliente.Get(dSesion.GetEmpresaId(), Convert.ToInt64(clienteId));

                if (cliente == null)
                    throw new Exception("No se encontro informacion del cliente");

                if (cliente.eliminado || !cliente.activo)
                    throw new Exception("El cliente ya no se encuentra activo en el sistema");

                oVwTarifaAbonado tarifa = dTarifaAbonado.Get(dSesion.GetEmpresaId(), dSesion.GetOficinaId(), Convert.ToInt64(clienteId));

                if (tarifa == null)
                {
                    tarifa = new oVwTarifaAbonado();
                    tarifa.moneda_id = "1"; 
                    tarifa.monto =0;
                }

                ViewBag.cliente = cliente.nombre;

                return new Ext.Net.MVC.PartialViewResult
                {
                    ViewName = "FrmEditarTarifa",
                    Model = tarifa,
                    ViewData = ViewData
                };
            }
            catch (Exception ex)
            {
                return Json(new { success = false, msg = ex.Message });
            }
        }

        public ActionResult FrmComprobante(long? clienteId)
        {
            try
            {
                oVwCliente cliente = dCliente.Get(dSesion.GetEmpresaId(), Convert.ToInt64(clienteId));

                if (cliente == null)
                    throw new Exception("No se encontro informacion del cliente");

                List<oLiquidacion> liquidaciones = PcaCaja.DAL.dLiquidacion.GetListActivo(dSesion.GetEmpresaId(), dSesion.GetOficinaId(), dSesion.GetUsuarioId());

                if (liquidaciones.Count == 0)
                    throw new Exception("No existe una liquidacion abierta para su usuario-terminal");

                

                if (cliente.eliminado || !cliente.activo)
                    throw new Exception("El cliente ya no se encuentra activo en el sistema");

                oVwTarifaAbonado tarifa = dTarifaAbonado.Get(dSesion.GetEmpresaId(), dSesion.GetOficinaId(), Convert.ToInt64(clienteId));

                if (tarifa == null)
                    throw new Exception("No existe tarifa para el cliente");

                oUsuarioTerminal usuarioTerminal = dUsuarioTerminal.Get(dSesion.GetEmpresaId(), dSesion.GetOficinaId(), dSesion.GetUsuarioId());

                if (usuarioTerminal == null)
                    throw new Exception("No existe un terminal asignado al usuario");

                oCorrelativo correlativo = dCorrelativo.Get(usuarioTerminal.empresa_id, usuarioTerminal.oficina_id, usuarioTerminal.terminal_id, "12");

                if (correlativo == null)
                    throw new Exception("No existe correlativo para emitir tickets");

                ViewBag.monedaId = tarifa.moneda_id;
                ViewBag.precioVenta = tarifa.monto;
                ViewBag.siglasMoneda = tarifa.siglas_moneda;
                ViewBag.cliente = cliente.nombre;
                ViewBag.detalle = "ALQUILER ESTACIONAMIENTO";
                ViewBag.proxyUrlPrinter = correlativo.url_proxy_impresora; 

                return new Ext.Net.MVC.PartialViewResult
                {
                    ViewName = "FrmComprobante",
                    ViewData = ViewData
                };
            }
            catch (Exception ex)
            {
                return Json(new { success = false, msg = ex.Message });
            }
        }

        [HttpPost]
        public ActionResult ActualizarTarifa(long? clienteId,int? desencadenador_id, string moneda_id, long? monto)
        {
            try
            {
                oTarifaAbonado tarifa = new oTarifaAbonado();
                tarifa.empresa_id = dSesion.GetEmpresaId();
                tarifa.oficina_id = dSesion.GetOficinaId();
                tarifa.abonado_id = clienteId;
                tarifa.desencadenador_id = Convert.ToInt32(desencadenador_id);
                tarifa.moneda_id = moneda_id;
                tarifa.monto = Convert.ToInt64(monto);

                dTarifaAbonado.Update(tarifa);

                return Json(new { success = true });
            }
            catch (Exception ex)
            {
                return Json(new { success = false, msg = ex.Message });
            }
        }

        [HttpPost]
        public ActionResult EmitirComprobante(long? liquidacion_id,
                                              long? clienteId,
                                              string detalle,
                                              string tipoMedioPagoId,
                                              string monedaId,
                                              decimal? precio_venta,
                                              decimal? efectivo_percibido)
        {
            try
            {
                if (precio_venta <= 0)
                    throw new Exception("Precio venta no puede ser menor o igual a CERO");

                if (efectivo_percibido < precio_venta)
                    throw new Exception("Efectivo percibido no puede ser menor al precio venta");

                if (string.IsNullOrEmpty(detalle))
                    throw new Exception("Detalle no puede estar vacio");


                long idComprobante = dPagoAbonado.EmitirComprobante(dSesion.GetEmpresaId(),
                                                                    dSesion.GetOficinaId(),
                                                                    Convert.ToInt64(liquidacion_id),
                                                                    dSesion.GetUsuarioId(),
                                                                    Convert.ToInt64(clienteId),
                                                                    0,
                                                                    dSesion.GetId(),
                                                                    detalle,
                                                                    tipoMedioPagoId,
                                                                    monedaId,
                                                                    Convert.ToDecimal(precio_venta),
                                                                    Convert.ToDecimal(efectivo_percibido));

                try
                {
                    TicketAbonado ticket = new TicketAbonado(idComprobante);
                    string dataEncode = Core.Base64Encode(JsonConvert.SerializeObject(ticket.GetLinesPrint));
                    return Json(new { success = true, printTicket = true, data = dataEncode, proxyUrl = ticket.GetPrinterProxy, puerto = ticket.GetPrinterPort });
                }
                catch { }

                return Json(new { success = true, printTicket = false });
            }
            catch (Exception ex)
            {
                return Json(new { success = false, msg = ex.Message });
            }
        }
    }
}